www.gusucode.com > VC++仿XP免费Prof UIS界面库-源码程序 > VC++仿XP免费Prof UIS界面库-源码程序/code/Samples/FixedSizePanels/MainFrm.cpp

    //Download by http://www.NewXing.com
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "FixedSizePanels.h"

#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDemoHtmlCtrl

IMPLEMENT_DYNAMIC( CDemoHtmlCtrl, CWnd );

CDemoHtmlCtrl::CDemoHtmlCtrl()
	: m_pBrowser( NULL )
	, m_bReflectParentSizing( false )
{
}

CDemoHtmlCtrl::~CDemoHtmlCtrl()
{
}


BEGIN_MESSAGE_MAP(CDemoHtmlCtrl, CWnd)
	//{{AFX_MSG_MAP(CDemoHtmlCtrl)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CDemoHtmlCtrl message handlers

bool CDemoHtmlCtrl::Create(
		CWnd * pWndParent,
		CRect rectInit // = CRect(0,0,0,0)
		)
{
UINT nID = pWndParent->GetDlgCtrlID();
CString sWindowName;
	pWndParent->GetWindowText( sWindowName );
	if(	!CreateControl(
			CLSID_WebBrowser,
			LPCTSTR(sWindowName),
			WS_VISIBLE|WS_CHILD,
			rectInit,
			pWndParent,
			nID
			)
		)
	{ // if IWebBrowser2 is not created successfully
		ASSERT( FALSE );
		DestroyWindow();
		return false;
	} // if IWebBrowser2 is not created successfully

LPUNKNOWN lpUnk = GetControlUnknown();
	ASSERT( lpUnk != NULL );
HRESULT hr = lpUnk->QueryInterface(IID_IWebBrowser2, (void**) &m_pBrowser);
	if( FAILED(hr) )
	{
		ASSERT( FALSE );
		DestroyWindow();
		return false;
	}

	return true;
}

void CDemoHtmlCtrl::GoBack()
{
	ASSERT_VALID( this );
	ASSERT( m_pBrowser != NULL );
	m_pBrowser->GoBack();
}

void CDemoHtmlCtrl::GoForward()
{
	ASSERT_VALID( this );
	ASSERT( m_pBrowser != NULL );
	m_pBrowser->GoForward();
}

void CDemoHtmlCtrl::Refresh()
{
	ASSERT_VALID( this );
	ASSERT( m_pBrowser != NULL );
	m_pBrowser->Refresh();
}

void CDemoHtmlCtrl::NavigateURL( LPCTSTR lpszURL )
{
	ASSERT_VALID( this );
	ASSERT( m_pBrowser != NULL );

COleSafeArray vPostData;

COleVariant vURL( lpszURL, VT_BSTR );
COleVariant vHeaders( LPCTSTR(NULL), VT_BSTR);
COleVariant vTargetFrameName( LPCTSTR(NULL), VT_BSTR );
COleVariant vFlags( 0L, VT_I4 );

	m_pBrowser->Navigate2(
		vURL,
		vFlags,
		vTargetFrameName,
		vPostData,
		vHeaders
		);
}

void CDemoHtmlCtrl::NavigateResourceID(
	UINT nResourceID
	)
{
	ASSERT_VALID( this );
	ASSERT( m_pBrowser != NULL );

CString sAppName;
	::GetModuleFileName(
		NULL,
		sAppName.GetBuffer( _MAX_PATH + 1 ),
		_MAX_PATH
		);
	sAppName.ReleaseBuffer();
CString sResourseID;
	sResourseID.Format( _T("%d"), INT(nResourceID) );
CString sNavigatePath;
	sNavigatePath =
		_T("res://")
		+ sAppName
		+ _T("/") //+ _T(".exe/")
		+ sResourseID
		;
	NavigateURL( sNavigatePath );
}

/////////////////////////////////////////////////////////////////////////////
// CPanelEmpty

IMPLEMENT_DYNAMIC(CPanelEmpty, CExtPanelControlBar)

CPanelEmpty::CPanelEmpty()
{
}

CPanelEmpty::~CPanelEmpty()
{
}

CSize CPanelEmpty::OnQueryFixedBarNewSize(
	CExtPanelControlBar::e_fixed_bar_size_query_t eWhichSizeNeedToKnow
	) const
{
	ASSERT_VALID( this );
	switch( eWhichSizeNeedToKnow )
	{
	case CExtPanelControlBar::e_fixed_bar_size_query_t::__FSQ_DOCKED_H:
		return CSize(150,50);
	case CExtPanelControlBar::e_fixed_bar_size_query_t::__FSQ_DOCKED_V:
		return CSize(50,150);
	default:
		return CSize(150,150);
	} // switch( eWhichSizeNeedToKnow )
}

BEGIN_MESSAGE_MAP(CPanelEmpty, CExtPanelControlBar)
	//{{AFX_MSG_MAP(CPanelEmpty)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPanelCustomDrawn

IMPLEMENT_DYNAMIC(CPanelCustomDrawn, CPanelEmpty)

CPanelCustomDrawn::CPanelCustomDrawn()
{
}

CPanelCustomDrawn::~CPanelCustomDrawn()
{
}

BEGIN_MESSAGE_MAP(CPanelCustomDrawn, CPanelEmpty)
	//{{AFX_MSG_MAP(CPanelCustomDrawn)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CPanelCustomDrawn::OnPaint()
{
	ASSERT_VALID( this );

CPaintDC dcPaint( this );
CExtMemoryDC dc( &dcPaint );
CRect rcClient;
	GetClientRect( &rcClient );
	ASSERT( GetWindow( GW_CHILD ) == NULL );
	// fill gradient & draw text
	dc.FillSolidRect(
		&rcClient,
		g_PaintManager->GetColor(
			CExtPaintManager::CLR_3DFACE_OUT
			)
		);
	rcClient.DeflateRect( 2, 2 );
	COLORREF clrFc = g_PaintManager->GetColor(COLOR_3DFACE);
	COLORREF clrDk = g_PaintManager->GetColor(COLOR_3DDKSHADOW);
	COLORREF clrHi = g_PaintManager->GetColor(COLOR_3DHILIGHT);
	COLORREF clrLo = g_PaintManager->GetColor(COLOR_3DSHADOW);
	dc.Draw3dRect( &rcClient, clrFc, clrDk );
	rcClient.DeflateRect( 1, 1 );
	dc.Draw3dRect( &rcClient, clrHi, clrLo );
	rcClient.DeflateRect( 1, 1 );
	dc.Draw3dRect( &rcClient, clrLo, clrHi );
	rcClient.DeflateRect( 1, 1 );
	dc.Draw3dRect( &rcClient, clrDk, clrFc );
	rcClient.DeflateRect( 2, 2 );
	UINT nDockBarID = GetSafeDockBarDlgCtrlID();
	CExtPaintManager::stat_PaintGradientRect(
		dc,
		rcClient,
		RGB( 128, 128, 255 ),
		RGB( 0, 0, 0 ),
		(nDockBarID==AFX_IDW_DOCKBAR_LEFT || nDockBarID==AFX_IDW_DOCKBAR_RIGHT)
			? true : false
		);
	
	CRect rcDrawText( rcClient );
	rcDrawText.DeflateRect( 5, 5 );
	CRect rcDrawTextShadow( rcDrawText );
	CString sText;
	CFont * pFont = &g_PaintManager->m_FontNormal;
	switch( nDockBarID )
	{
	case AFX_IDW_DOCKBAR_TOP:
		sText = _T("Docked at top");
		rcDrawTextShadow.OffsetRect( 1, 1 );
	break;
	case AFX_IDW_DOCKBAR_BOTTOM:
		sText = _T("Docked at bottom");
		rcDrawTextShadow.OffsetRect( 1, 1 );
	break;
	case AFX_IDW_DOCKBAR_LEFT:
		sText = _T("Docked at left");
		pFont = &g_PaintManager->m_FontNormalVert;
		rcDrawText.OffsetRect( rcDrawText.Width(), 0 );
		rcDrawText.OffsetRect( -1, -2 );
		rcDrawTextShadow = rcDrawText;
		rcDrawTextShadow.OffsetRect( 1, 1 );
	break;
	case AFX_IDW_DOCKBAR_RIGHT:
		sText = _T("Docked at right");
		pFont = &g_PaintManager->m_FontNormalVert;
		rcDrawText.OffsetRect( rcDrawText.Width(), 0 );
		rcDrawText.OffsetRect( -1, -2 );
		rcDrawTextShadow = rcDrawText;
		rcDrawTextShadow.OffsetRect( 1, 1 );
	break;
	default:
		ASSERT( nDockBarID == AFX_IDW_DOCKBAR_FLOAT );
		sText = _T("Floating");
		rcDrawTextShadow.OffsetRect( 1, 1 );
	break;
	} // switch( nDockBarID )
	CFont * pOldFont = dc.SelectObject( pFont );
	int nOldBkMode = dc.SetBkMode( TRANSPARENT );
	COLORREF clrOldTextColor = dc.SetTextColor( RGB(128,128,128) );
	dc.DrawText( sText, &rcDrawTextShadow, DT_SINGLELINE|DT_NOCLIP );
	dc.SetTextColor( RGB(255,255,255) );
	dc.DrawText( sText, &rcDrawText, DT_SINGLELINE|DT_NOCLIP );
	dc.SetTextColor( clrOldTextColor );
	dc.SetBkMode( nOldBkMode );
	dc.SelectObject( pOldFont );
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame::CColorStatic

CMainFrame::CColorStatic::CColorStatic()
	: m_clrIn( RGB(0,0,0) )
	, m_clrOut( RGB(255,255,255) )
{
}

LRESULT CMainFrame::CColorStatic::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	if( message == WM_PAINT )
	{
		CPaintDC dc( this );
		CRect rcClient;
		GetClientRect( &rcClient );
		dc.FillRect( &rcClient, &g_PaintManager->m_brushLightDefault );
		COLORREF clrLight		= g_PaintManager->GetColor(COLOR_3DHILIGHT);
		COLORREF clrDkShadow	= g_PaintManager->GetColor(COLOR_3DDKSHADOW);
		COLORREF clrFace		= g_PaintManager->GetColor(COLOR_3DFACE);
		COLORREF clrShadow		= g_PaintManager->GetColor(COLOR_3DSHADOW);
		dc.Draw3dRect( &rcClient, clrShadow, clrLight );
		rcClient.DeflateRect( 1, 1 );
		dc.Draw3dRect( &rcClient, clrDkShadow, clrFace );
		rcClient.DeflateRect( 1, 1 );
		
		CRect rcButtonIn;
		GetWindow(GW_HWNDNEXT)->GetWindowRect( &rcButtonIn );
		rcButtonIn.OffsetRect( -rcButtonIn.TopLeft() );
		rcButtonIn.InflateRect( 1, 1 );
		rcButtonIn.OffsetRect( rcClient.TopLeft() );
		
		CRect rcButtonOut( rcButtonIn );
		rcButtonOut.OffsetRect( rcButtonOut.Width()/2, rcButtonOut.Height()/2 );
		CRect rcUnion( rcButtonIn.left, rcButtonIn.top, rcButtonOut.right, rcButtonOut.bottom );
		CPoint ptOffset(
			( rcClient.Width() - rcUnion.Width() ) / 2 + 1,
			( rcClient.Height() - rcUnion.Height() ) / 2 + 1
			);
		rcButtonIn.OffsetRect( ptOffset );
		rcButtonOut.OffsetRect( ptOffset );
		
		dc.FillSolidRect( &rcButtonOut, m_clrOut );
		dc.Draw3dRect( &rcButtonOut, clrFace, clrDkShadow );
		rcButtonOut.DeflateRect( 1, 1 );
		dc.Draw3dRect( &rcButtonOut, clrLight, clrShadow );
		rcButtonOut.DeflateRect( 1, 1 );
		dc.Draw3dRect( &rcButtonOut, clrFace, clrFace );
		
		dc.FillSolidRect( &rcButtonIn, m_clrIn );
		dc.Draw3dRect( &rcButtonIn, clrFace, clrDkShadow );
		rcButtonIn.DeflateRect( 1, 1 );
		dc.Draw3dRect( &rcButtonIn, clrLight, clrShadow );
		rcButtonIn.DeflateRect( 1, 1 );
		dc.Draw3dRect( &rcButtonIn, clrFace, clrFace );
		
		return 0;
	} // if( message == WM_PAINT )
	
	if( message == WM_ERASEBKGND )
	{
		return (!0);
	} // if( message == WM_ERASEBKGND )

	return CStatic::WindowProc(message,wParam,lParam);
}


/////////////////////////////////////////////////////////////////////////////
// CMainFrame::CDynamicButton

void CMainFrame::CDynamicButton::_OnClick(
	bool bSelectAny,
	bool bSeparatedDropDownClicked
	)
{
	ASSERT_VALID( this );
	bSelectAny;
	bSeparatedDropDownClicked;
CFrameWnd * pFrame = GetParentFrame();
	ASSERT_VALID( pFrame );
	if( pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) )
	{
		pFrame = pFrame->GetParentFrame();
		ASSERT_VALID( pFrame );
	}
	pFrame->SetFocus();
	ASSERT_KINDOF( CMainFrame, pFrame );
	if( ((CMainFrame*)pFrame)->m_hWndSelectedToolButton != NULL )
	{
		::InvalidateRect(
			((CMainFrame*)pFrame)->m_hWndSelectedToolButton,
			NULL,
			FALSE
			);
	}
	((CMainFrame*)pFrame)->m_hWndSelectedToolButton = m_hWnd;
	Invalidate();
	pFrame->SendMessage(
		WM_COMMAND,
		(WPARAM)GetDlgCtrlID(),
		(LPARAM)m_hWnd
		);
}

void CMainFrame::CDynamicButton::_RenderImpl(
	CDC & dc,
	bool bTransparent // = false
	)
{
	ASSERT_VALID( this );
CRect rectClient;
	GetClientRect( &rectClient );
CString sWindowText( _T("") );
	GetWindowText( sWindowText );
bool bDrawFocusRect = false; // (GetFocus() == this) ? true : false;
bool bDefault = GetDefault() ? true : false;
bool bPushed = (m_bPushed || GetCheck()) ? true : false;
bool bEnabled = IsWindowEnabled() ? true : false;
bool bFlat = GetFlat() ? true : false;
bool bHover =
		( m_bMouseOver
		&& !CExtPopupMenuWnd::IsMenuTracking() )
			? true : false;
HICON hIcon = (bHover) ? m_hIconIn : m_hIconOut;
	if( GetParent()->IsKindOf(RUNTIME_CLASS(CControlBar)) )
	{
		bDrawFocusRect = false;
		bFlat = true;
	}
	if( !bPushed )
	{
		CFrameWnd * pFrame = GetParentFrame();
		ASSERT_VALID( pFrame );
		if( pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) )
		{
			pFrame = pFrame->GetParentFrame();
			ASSERT_VALID( pFrame );
		}
		ASSERT_KINDOF( CMainFrame, pFrame );
		if( ((CMainFrame*)pFrame)->m_hWndSelectedToolButton == m_hWnd )
			bPushed = bHover = true;
	}
	if(		(! (bHover || bPushed) )
		&&	g_PaintManager->GetCb2DbTransparentMode(this)
		)
	{
		CExtPaintManager::stat_ExcludeChildAreas(
			dc,
			GetSafeHwnd(),
			CExtPaintManager::stat_DefExcludeChildAreaCallback
			);
		g_PaintManager->PaintDockerBkgnd( dc, this );
		bTransparent = true;
	}
CExtCmdIcon _icon( hIcon, false );
CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd(
		this,										   
		true, rectClient, (LPCTSTR)sWindowText,
		&_icon, bFlat, bHover, bPushed,
		false, bEnabled,
		m_bDrawBorder ? true : false,
		bDrawFocusRect, bDefault, m_nAlign,
		NULL, _IsMenuAvail(), 0, bTransparent
		);
	_ppbd.m_bSeparatedDropDown = m_bSeparatedDropDown ? true : false;
	if( _ppbd.m_bSeparatedDropDown
		&& m_nTrackingHT == 2
		&& _ppbd.m_bPushed
		)
	{
		_ppbd.m_bPushed = false;
		_ppbd.m_bPushedDropDown = true;
//		_ppbd.m_bHover = false;
	}
	g_PaintManager->PaintPushButton( dc, _ppbd );
	_icon.DetachAsHICON();
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame::CDynamicPaletteButton

CMainFrame::CDynamicPaletteButton::CDynamicPaletteButton( COLORREF clr )
	: m_clr( clr )
{
}

LRESULT CMainFrame::CDynamicPaletteButton::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	if(		message == WM_LBUTTONDOWN
		||	message == WM_RBUTTONDOWN
		)
	{
		CFrameWnd * pFrame = GetParentFrame();
		ASSERT_VALID( pFrame );
		if( pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) )
		{
			pFrame = pFrame->GetParentFrame();
			ASSERT_VALID( pFrame );
		}
		pFrame->SetFocus();
		ASSERT_KINDOF( CMainFrame, pFrame );
		Invalidate();
		WPARAM wParam = (WPARAM)GetDlgCtrlID();
		if( message == WM_RBUTTONDOWN )
			wParam += 160;
		pFrame->SendMessage(
			WM_COMMAND,
			wParam,
			(LPARAM)m_hWnd
			);
		return 0L;
	}
	if(		message == WM_LBUTTONUP
		||	message == WM_RBUTTONUP
		)
	{
		return 0L;
	}
	return CDynamicButton::WindowProc(message,wParam,lParam);
}

void CMainFrame::CDynamicPaletteButton::_OnClick(
	bool bSelectAny,
	bool bSeparatedDropDownClicked
	)
{
	ASSERT_VALID( this );
	bSelectAny;
	bSeparatedDropDownClicked;
CFrameWnd * pFrame = GetParentFrame();
	ASSERT_VALID( pFrame );
	if( pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) )
	{
		pFrame = pFrame->GetParentFrame();
		ASSERT_VALID( pFrame );
	}
	pFrame->SetFocus();
	ASSERT_KINDOF( CMainFrame, pFrame );
	Invalidate();
	pFrame->SendMessage(
		WM_COMMAND,
		(WPARAM)GetDlgCtrlID(),
		(LPARAM)m_hWnd
		);
}

void CMainFrame::CDynamicPaletteButton::_RenderImpl( // non-buffered paint
	CDC & dc,
	bool bTransparent // = false
	)
{
	ASSERT_VALID( this );
	bTransparent;
CRect rectClient;
	GetClientRect( &rectClient );
bool bPushed = (m_bPushed || GetCheck()) ? true : false;
bool bHover =
		( m_bMouseOver
		&& !CExtPopupMenuWnd::IsMenuTracking() )
			? true : false;
	dc.FillSolidRect( &rectClient, m_clr );

COLORREF clrLight		= g_PaintManager->GetColor(COLOR_3DHILIGHT);
COLORREF clrDkShadow	= g_PaintManager->GetColor(COLOR_3DDKSHADOW);
	if( bPushed || bHover )
	{
COLORREF clrFace		= g_PaintManager->GetColor(COLOR_3DFACE);
COLORREF clrShadow		= g_PaintManager->GetColor(COLOR_3DSHADOW);
		dc.Draw3dRect(
			&rectClient,
			clrShadow,
			clrLight
			);
		rectClient.DeflateRect( 1, 1 );
		dc.Draw3dRect(
			&rectClient,
			clrDkShadow,
			clrFace
			);
	}
	else
	{
		dc.Draw3dRect(
			&rectClient,
			clrDkShadow,
			clrLight
			);
	}
}


/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_WM_SETFOCUS()
	ON_COMMAND(ID_VIEW_LIKE_OFFICE_2K, OnViewLikeOffice2k)
	ON_UPDATE_COMMAND_UI(ID_VIEW_LIKE_OFFICE_2K, OnUpdateViewLikeOffice2k)
	ON_COMMAND(ID_VIEW_LIKE_OFFICE_XP, OnViewLikeOfficeXp)
	ON_UPDATE_COMMAND_UI(ID_VIEW_LIKE_OFFICE_XP, OnUpdateViewLikeOfficeXp)
	ON_COMMAND(ID_VIEW_LIKE_OFFICE_2003, OnViewLikeOffice2003)
	ON_UPDATE_COMMAND_UI(ID_VIEW_LIKE_OFFICE_2003, OnUpdateViewLikeOffice2003)
	//}}AFX_MSG_MAP

	ON_COMMAND_EX( ID_VIEW_MENUBAR, OnBarCheck )
	ON_UPDATE_COMMAND_UI( ID_VIEW_MENUBAR, OnUpdateControlBarMenu )

	ON_COMMAND_EX( IDR_TOOLBAR2, OnBarCheck )
	ON_UPDATE_COMMAND_UI( IDR_TOOLBAR2, OnUpdateControlBarMenu )

	ON_COMMAND_EX( ID_VIEW_PANEL_EMPTY, OnBarCheck )
	ON_UPDATE_COMMAND_UI( ID_VIEW_PANEL_EMPTY, OnUpdateControlBarMenu )

	ON_COMMAND_EX( ID_VIEW_PANEL_CUSTOM_DRAWN, OnBarCheck )
	ON_UPDATE_COMMAND_UI( ID_VIEW_PANEL_CUSTOM_DRAWN, OnUpdateControlBarMenu )

	ON_COMMAND_EX( ID_VIEW_PANEL_EDIT, OnBarCheck )
	ON_UPDATE_COMMAND_UI( ID_VIEW_PANEL_EDIT, OnUpdateControlBarMenu )

	ON_COMMAND_EX( ID_VIEW_PANEL_DIALOG, OnBarCheck )
	ON_UPDATE_COMMAND_UI( ID_VIEW_PANEL_DIALOG, OnUpdateControlBarMenu )

	ON_COMMAND_EX( ID_VIEW_PANEL_TOOLS, OnBarCheck )
	ON_UPDATE_COMMAND_UI( ID_VIEW_PANEL_TOOLS, OnUpdateControlBarMenu )

	ON_COMMAND_EX( ID_VIEW_PANEL_PALETTE, OnBarCheck )
	ON_UPDATE_COMMAND_UI( ID_VIEW_PANEL_PALETTE, OnUpdateControlBarMenu )

	ON_COMMAND_EX( ID_VIEW_PANEL_RESIZABLE1, OnBarCheck )
	ON_UPDATE_COMMAND_UI( ID_VIEW_PANEL_RESIZABLE1, OnUpdateControlBarMenu )

	ON_COMMAND_EX( ID_VIEW_PANEL_RESIZABLE2, OnBarCheck )
	ON_UPDATE_COMMAND_UI( ID_VIEW_PANEL_RESIZABLE2, OnUpdateControlBarMenu )

	ON_COMMAND_RANGE( IDC_BUTTON1, IDC_BUTTON16, OnClickedToolButton )
	ON_COMMAND_RANGE( IDC_BUTTON17, IDC_BUTTON176, OnClickedPaletteButtonL )
	ON_COMMAND_RANGE( (IDC_BUTTON17+160), (IDC_BUTTON176+160), OnClickedPaletteButtonR )

END_MESSAGE_MAP()


static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	m_hWndSelectedToolButton = NULL;

	g_PaintManager.InstallPaintManager( new CExtPaintManager );

	// window placement persistence
	::memset( &m_dataFrameWP, 0, sizeof(WINDOWPLACEMENT) );
	m_dataFrameWP.length = sizeof(WINDOWPLACEMENT);
	m_dataFrameWP.showCmd = SW_HIDE;
}

CMainFrame::~CMainFrame()
{
}

static UINT g_statBasicCommands[] =
{
	ID_APP_ABOUT,
	ID_APP_EXIT,
	ID_VIEW_MENUBAR,
	ID_VIEW_TOOLBAR,
	IDR_TOOLBAR2,
	ID_VIEW_STATUS_BAR,
	ID_VIEW_PANEL_EMPTY,
	ID_VIEW_PANEL_CUSTOM_DRAWN,
	ID_VIEW_PANEL_EDIT,
	ID_VIEW_PANEL_DIALOG,
	ID_VIEW_PANEL_TOOLS,
	ID_VIEW_PANEL_PALETTE,
	ID_VIEW_PANEL_RESIZABLE1,
	ID_VIEW_PANEL_RESIZABLE2,
	0, // end of list
};

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	// create a view to occupy the client area of the frame
	if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
		CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
	{
		TRACE0("Failed to create view window\n");
		return -1;
	}
	
CWinApp * pApp = ::AfxGetApp();
	ASSERT( pApp != NULL );
	ASSERT( pApp->m_pszRegistryKey != NULL );
	ASSERT( pApp->m_pszRegistryKey[0] != _T('\0') );
	ASSERT( pApp->m_pszProfileName != NULL );
	ASSERT( pApp->m_pszProfileName[0] != _T('\0') );

	ASSERT( pApp->m_pszProfileName != NULL );
	g_CmdManager->ProfileSetup(
		pApp->m_pszProfileName,
		GetSafeHwnd()
		);
	VERIFY(
		g_CmdManager->UpdateFromMenu(
			pApp->m_pszProfileName,
			IDR_MAINFRAME
			)
		);

	if( !m_wndMenuBar.Create(
			NULL,
			this,
			ID_VIEW_MENUBAR
			)
		)
    {
        TRACE0("Failed to create menubar\n");
        return -1;      // failed to create
    }

	if( !m_wndToolBar.Create(
			_T("ToolBar"),
			this,
			AFX_IDW_TOOLBAR
			)
		||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)
		)
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if( !m_wndToolBar2.Create(
			_T("ToolBar2"),
			this,
			IDR_TOOLBAR2
			)
		||
		!m_wndToolBar2.LoadToolBar(IDR_TOOLBAR2)
		)
	{
		TRACE0("Failed to create toolbar2\n");
		return -1;      // fail to create
	}

CExtCmdItem * pCmdItem;

	pCmdItem =
		g_CmdManager->CmdGetPtr(
			pApp->m_pszProfileName,
			ID_VIEW_LIKE_OFFICE_2K
			);
	ASSERT( pCmdItem != NULL );
	pCmdItem->m_sToolbarText = _T("Show me 2000");

	pCmdItem =
		g_CmdManager->CmdGetPtr(
			pApp->m_pszProfileName,
			ID_VIEW_LIKE_OFFICE_XP
			);
	ASSERT( pCmdItem != NULL );
	pCmdItem->m_sToolbarText = _T("Toggle to modern XP");

	pCmdItem =
		g_CmdManager->CmdGetPtr(
			pApp->m_pszProfileName,
			ID_VIEW_LIKE_OFFICE_2003
			);
	ASSERT( pCmdItem != NULL );
	pCmdItem->m_sToolbarText = _T("I like 2003");

	if(		!m_wndPanelEmpty.Create(
				_T("Empty Panel"),
				this,
				ID_VIEW_PANEL_EMPTY,
				WS_CHILD|WS_VISIBLE
					|CBRS_RIGHT|CBRS_GRIPPER|CBRS_TOOLTIPS
					|CBRS_FLYBY|CBRS_SIZE_DYNAMIC
					|CBRS_HIDE_INPLACE
				)
		||	!m_wndPanelCustomDrawn.Create(
				_T("Custom-drawn Panel"),
				this,
				ID_VIEW_PANEL_CUSTOM_DRAWN,
				WS_CHILD|WS_VISIBLE
					|CBRS_RIGHT|CBRS_GRIPPER|CBRS_TOOLTIPS
					|CBRS_FLYBY|CBRS_SIZE_DYNAMIC
					|CBRS_HIDE_INPLACE
				)
		||	!m_wndPanelEdit.Create(
				_T("Panel With Edit Control"),
				this,
				ID_VIEW_PANEL_EDIT,
				WS_CHILD|WS_VISIBLE
					|CBRS_LEFT|CBRS_GRIPPER|CBRS_TOOLTIPS
					|CBRS_FLYBY|CBRS_SIZE_DYNAMIC
					|CBRS_HIDE_INPLACE
				)
					||	!m_wndEdit.Create(
							WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL
								|ES_MULTILINE|ES_WANTRETURN
								|ES_AUTOHSCROLL|ES_AUTOVSCROLL
								,
							CRect(0,0,160,80),
							&m_wndPanelEdit,
							UINT(IDC_STATIC)
							)
		||	!m_wndPanelDialog.Create(
				_T("Panel With Dialog"),
				this,
				ID_VIEW_PANEL_DIALOG,
				WS_CHILD|WS_VISIBLE
					|CBRS_LEFT|CBRS_GRIPPER|CBRS_TOOLTIPS
					|CBRS_FLYBY|CBRS_SIZE_DYNAMIC
					|CBRS_HIDE_INPLACE
				)
					||	!m_dlgForPanelDialog.Create(
							IDD_DIALOG_FOR_PANEL,
							&m_wndPanelDialog
							)
		||	!m_wndPanelTools.Create(
				_T("Tools Panel"),
				this,
				ID_VIEW_PANEL_TOOLS,
				WS_CHILD|WS_VISIBLE
					|CBRS_RIGHT|CBRS_GRIPPER|CBRS_TOOLTIPS
					|CBRS_FLYBY|CBRS_SIZE_DYNAMIC
					|CBRS_HIDE_INPLACE
				)
					||	!m_dlgForPanelTools.Create(
							IDD_DIALOG_TOOLS,
							&m_wndPanelTools
							)
		||	!m_wndPanelPalette.Create(
				_T("Palette Panel"),
				this,
				ID_VIEW_PANEL_PALETTE,
				WS_CHILD|WS_VISIBLE
					|CBRS_BOTTOM|CBRS_GRIPPER|CBRS_TOOLTIPS
					|CBRS_FLYBY|CBRS_SIZE_DYNAMIC
					|CBRS_HIDE_INPLACE
				)
					||	!m_dlgForPanelPalette.Create(
							IDD_DIALOG_PALETTE,
							&m_wndPanelPalette
							)
		||	!m_wndResizableBar1.Create(
				_T("Resizable panel 1 (in fixed mode)"),
				this,
				ID_VIEW_PANEL_RESIZABLE1
				)
			||	!m_wndHtmlCtrl1.Create(
					&m_wndResizableBar1,
					CRect( 0, 0, 150, 150 )
					)
		||	!m_wndResizableBar2.Create(
				_T("Resizable panel 2 (in fixed mode)"),
				this,
				ID_VIEW_PANEL_RESIZABLE2
				)
			||	!m_wndHtmlCtrl2.Create(
					&m_wndResizableBar2,
					CRect( 0, 0, 150, 150 )
					)
		)
	{
		TRACE0("Failed to create bars/panels\n");
		return -1;      // fail to create
	}
	m_wndHtmlCtrl1.NavigateResourceID( IDR_HTML_DEMO_PAGE1 );
	m_wndHtmlCtrl2.NavigateResourceID( IDR_HTML_DEMO_PAGE2 );
	m_wndEdit.ModifyStyleEx(0,WS_EX_CLIENTEDGE,SWP_FRAMECHANGED);
	m_wndEdit.SetFont(
		CFont::FromHandle(
			(HFONT)::GetStockObject(DEFAULT_GUI_FONT)
			)
		);
	m_wndEdit.SetWindowText( _T("Fixed size panel\r\nwith edit control") );
	m_dlgForPanelDialog.ShowSizeGrip( FALSE );
	m_dlgForPanelTools.ShowSizeGrip( FALSE );
CImageList _ilTools;
	VERIFY( _ilTools.Create( IDB_BITMAP_TOOLS, 16, 1, RGB(255,0,255) ) );
HWND hWndToolBtn = ::GetWindow( m_dlgForPanelTools.m_hWnd, GW_CHILD );
	for( int iToolBtn=0; iToolBtn < 16; iToolBtn++, hWndToolBtn = ::GetWindow(hWndToolBtn,GW_HWNDNEXT) )
	{
		ASSERT( hWndToolBtn != NULL );
		ASSERT( ::IsWindow(hWndToolBtn) );
		if( iToolBtn == 0 )
		{
			m_hWndSelectedToolButton = hWndToolBtn; 
			::InvalidateRect(
				m_hWndSelectedToolButton,
				NULL,
				FALSE
				);
		}
		CDynamicButton * pBtn =
			new CDynamicButton;
		pBtn->SubclassWindow( hWndToolBtn );
		pBtn->SetFlat( TRUE );
		pBtn->SetIcon( _ilTools.ExtractIcon( iToolBtn ) );
		CExtSafeString sToolTip;
		sToolTip.Format(
			_T("Tool button %d"),
			iToolBtn + 1
			);
		pBtn->SetTooltipText( sToolTip );
	}
	hWndToolBtn = ::GetWindow( m_dlgForPanelPalette.m_hWnd, GW_CHILD );
	ASSERT( hWndToolBtn != NULL );
	ASSERT( ::IsWindow(hWndToolBtn) );
	m_wndColorStatic.SubclassWindow( hWndToolBtn );
	hWndToolBtn = ::GetWindow(hWndToolBtn,GW_HWNDNEXT);
	for( iToolBtn=0; iToolBtn < 160; iToolBtn++, hWndToolBtn = ::GetWindow(hWndToolBtn,GW_HWNDNEXT) )
	{
		ASSERT( hWndToolBtn != NULL );
		ASSERT( ::IsWindow(hWndToolBtn) );
		COLORREF clr;
		if( iToolBtn < 32 )
		{
			double fColorSrc = double(iToolBtn)/32.0;
			clr = 
				CExtPaintManager::stat_HLStoRGB(
					0.0,
					sqrt( fColorSrc ),
					0.0
					);
		} // if( iToolBtn < 32 )
		else
		{
			int iColorSrc = iToolBtn-32;
			int iSat = iColorSrc/32;
			ASSERT( iSat >= 0 && iSat <= 3 );
			double fSat = 0.15;
			if( iSat == 1 )
				fSat = 0.3;
			else if( iSat == 2 )
				fSat = 0.5;
			else if( iSat == 3 )
				fSat = 1.0;

			iColorSrc = iColorSrc % 32;
			double fColorSrc = double(iColorSrc)/32.0;
			clr = 
				CExtPaintManager::stat_HLStoRGB(
					fColorSrc,
					0.5,
					fSat
					);
		} // else from if( iToolBtn < 32 )
		CDynamicPaletteButton * pBtn =
			new CDynamicPaletteButton( clr );
		pBtn->SubclassWindow( hWndToolBtn );
		CExtSafeString sToolTip;
		sToolTip.Format(
			_T("Palette button %d - #%02X%02X%02X"),
			iToolBtn + 1,
			int( GetRValue(clr) ),
			int( GetGValue(clr) ),
			int( GetBValue(clr) )
			);
		pBtn->SetTooltipText( sToolTip );
	}

	if(		!m_wndStatusBar.Create(this)
		||	!m_wndStatusBar.SetIndicators(
				indicators,
				sizeof(indicators) / sizeof(UINT)
			)
		)
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

    m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY);
	m_wndPanelEmpty.EnableDocking(CBRS_ALIGN_ANY);
	m_wndPanelCustomDrawn.EnableDocking(CBRS_ALIGN_ANY);
	m_wndPanelEdit.EnableDocking(CBRS_ALIGN_ANY);
	m_wndPanelDialog.EnableDocking(CBRS_ALIGN_ANY);
	m_wndPanelTools.EnableDocking(CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT);
	m_wndPanelPalette.EnableDocking(CBRS_ALIGN_BOTTOM);
	m_wndResizableBar1.EnableDocking(CBRS_ALIGN_ANY);
	m_wndResizableBar2.EnableDocking(CBRS_ALIGN_ANY);

	if( !CExtControlBar::FrameEnableDocking(this) )
	{
		ASSERT( FALSE );
		return -1;
	}
	
	VERIFY(
		g_CmdManager->SetBasicCommands(
			pApp->m_pszProfileName,
			g_statBasicCommands
			)
		);

	if( !CExtControlBar::ProfileBarStateLoad(
			this,
			pApp->m_pszRegistryKey,
			pApp->m_pszProfileName,
			pApp->m_pszProfileName,
			&m_dataFrameWP
			)
		)
	{
		DockControlBar( &m_wndMenuBar );
		DockControlBar( &m_wndToolBar );
		RecalcLayout();
		CRect wrAlredyDockedBar;
		m_wndToolBar.GetWindowRect( &wrAlredyDockedBar );
		wrAlredyDockedBar.OffsetRect( 1, 0 );
		DockControlBar( &m_wndToolBar2, AFX_IDW_DOCKBAR_TOP, &wrAlredyDockedBar );
		
		DockControlBar( &m_wndPanelCustomDrawn );
		m_wndPanelCustomDrawn.GetWindowRect( &wrAlredyDockedBar );
		wrAlredyDockedBar.OffsetRect( 0, 1 );
		DockControlBar( &m_wndPanelEmpty, AFX_IDW_DOCKBAR_RIGHT, &wrAlredyDockedBar );
		
		DockControlBar( &m_wndPanelEdit );
		m_wndPanelEdit.GetWindowRect( &wrAlredyDockedBar );
		wrAlredyDockedBar.OffsetRect( 0, 1 );
		DockControlBar( &m_wndPanelDialog, AFX_IDW_DOCKBAR_LEFT, &wrAlredyDockedBar );
		
		DockControlBar( &m_wndPanelTools );
		DockControlBar( &m_wndPanelPalette );
		DockControlBar( &m_wndResizableBar1, AFX_IDW_DOCKBAR_LEFT );
		DockControlBar( &m_wndResizableBar2, AFX_IDW_DOCKBAR_RIGHT );

		ShowControlBar( &m_wndPanelEmpty, FALSE, TRUE );
		ShowControlBar( &m_wndPanelEdit, FALSE, TRUE );
		ShowControlBar( &m_wndPanelDialog, FALSE, TRUE );
		ShowControlBar( &m_wndResizableBar2, FALSE, TRUE );
		RecalcLayout();
	}
	g_CmdManager->SerializeState(
		pApp->m_pszProfileName,
		pApp->m_pszRegistryKey,
		pApp->m_pszProfileName,
		false
		);

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
	cs.lpszClass = AfxRegisterWndClass(0);
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnSetFocus(CWnd* pOldWnd)
{
	pOldWnd;
	// forward focus to the view window
	m_wndView.SetFocus();
}

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
	// let the view have first crack at the command
	if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
		return TRUE;

	// otherwise, do default handling
	return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}


BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) 
{
	if( m_wndMenuBar.TranslateMainFrameMessage(pMsg) )
		return TRUE;
	
	return CFrameWnd::PreTranslateMessage(pMsg);
}

BOOL CMainFrame::DestroyWindow() 
{
CWinApp * pApp = ::AfxGetApp();
	ASSERT( pApp != NULL );
	ASSERT( pApp->m_pszRegistryKey != NULL );
	ASSERT( pApp->m_pszRegistryKey[0] != _T('\0') );
	ASSERT( pApp->m_pszProfileName != NULL );
	ASSERT( pApp->m_pszProfileName[0] != _T('\0') );

	VERIFY(
		CExtControlBar::ProfileBarStateSave(
			this,
			pApp->m_pszRegistryKey,
			pApp->m_pszProfileName,
			pApp->m_pszProfileName
			)
		);
	VERIFY(
		g_CmdManager->SerializeState(
			pApp->m_pszProfileName,
			pApp->m_pszRegistryKey,
			pApp->m_pszProfileName,
			true
			)
		);
	g_CmdManager->ProfileWndRemove( GetSafeHwnd() );
	
	return CFrameWnd::DestroyWindow();
}

void CMainFrame::OnViewLikeOffice2k() 
{
	if( !g_PaintManager->IsKindOf( RUNTIME_CLASS(CExtPaintManagerXP) ) )
		return;
	VERIFY(
		g_PaintManager.InstallPaintManager( new CExtPaintManager )
		);
	RecalcLayout();
	RedrawWindow(
		NULL,
		NULL,
		RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE
			| RDW_FRAME | RDW_ALLCHILDREN
		);
	CExtControlBar::stat_RedrawFloatingFrames( this );
	CExtControlBar::stat_RecalcBarMetrics( this );
}
void CMainFrame::OnUpdateViewLikeOffice2k(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable();
	pCmdUI->SetRadio(
		g_PaintManager->IsKindOf( RUNTIME_CLASS(CExtPaintManagerXP) )
			? FALSE
			: TRUE
		);
}
void CMainFrame::OnViewLikeOfficeXp() 
{
	if(		g_PaintManager->IsKindOf( RUNTIME_CLASS(CExtPaintManagerXP) )
		&&	(! g_PaintManager->IsKindOf( RUNTIME_CLASS(CExtPaintManagerOffice2003) ) )
		)
		return;
	VERIFY(
		g_PaintManager.InstallPaintManager( new CExtPaintManagerXP )
		);
	RecalcLayout();
	RedrawWindow(
		NULL,
		NULL,
		RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE
			| RDW_FRAME | RDW_ALLCHILDREN
		);
	CExtControlBar::stat_RedrawFloatingFrames( this );
	CExtControlBar::stat_RecalcBarMetrics( this );
}
void CMainFrame::OnUpdateViewLikeOfficeXp(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable();
	pCmdUI->SetRadio(
		(	g_PaintManager->IsKindOf( RUNTIME_CLASS(CExtPaintManagerXP) )
		&&	(! g_PaintManager->IsKindOf( RUNTIME_CLASS(CExtPaintManagerOffice2003) ) )
		)	? TRUE
			: FALSE
		);
}
void CMainFrame::OnViewLikeOffice2003() 
{
	if( g_PaintManager->IsKindOf( RUNTIME_CLASS(CExtPaintManagerOffice2003) ) )
		return;
	VERIFY(
		g_PaintManager.InstallPaintManager( new CExtPaintManagerOffice2003 )
		);
	RecalcLayout();
	RedrawWindow(
		NULL,
		NULL,
		RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE
			| RDW_FRAME | RDW_ALLCHILDREN
		);
	CExtControlBar::stat_RedrawFloatingFrames( this );
	CExtControlBar::stat_RecalcBarMetrics( this );
}
void CMainFrame::OnUpdateViewLikeOffice2003(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable();
	pCmdUI->SetRadio(
		g_PaintManager->IsKindOf( RUNTIME_CLASS(CExtPaintManagerOffice2003) )
			? TRUE
			: FALSE
		);
}

void CMainFrame::ActivateFrame(int nCmdShow) 
{
	// window placement persistence
	if( m_dataFrameWP.showCmd != SW_HIDE )
	{
		SetWindowPlacement( &m_dataFrameWP );
		CFrameWnd::ActivateFrame( m_dataFrameWP.showCmd );
		m_dataFrameWP.showCmd = SW_HIDE;
		return;
	}
	
	CFrameWnd::ActivateFrame(nCmdShow);
}

void CMainFrame::OnClickedToolButton( UINT nID )
{
	ASSERT( IDC_BUTTON1 <= nID && nID <= IDC_BUTTON16 );
CString sMsg;
	sMsg.Format(
		_T("Tool button %d clicked"),
		nID - IDC_BUTTON1 + 1
		);
	::AfxMessageBox( sMsg );
}

void CMainFrame::OnClickedPaletteButtonL( UINT nID )
{
	ASSERT( IDC_BUTTON17 <= nID && nID <= IDC_BUTTON176 );
CDynamicPaletteButton * pBtn = (CDynamicPaletteButton *)
		CWnd::FromHandlePermanent(
			::GetDlgItem( m_dlgForPanelPalette.m_hWnd, nID ) 
			);
	ASSERT_VALID( pBtn );
	m_wndColorStatic.m_clrIn = pBtn->m_clr;
	m_wndColorStatic.Invalidate();
CString sMsg;
	sMsg.Format(
		_T("Palette button %d clicked (left mouse button)\nColor is #%02X%02X%02X"),
		nID - IDC_BUTTON17 + 1,
		int( GetRValue(pBtn->m_clr) ),
		int( GetGValue(pBtn->m_clr) ),
		int( GetBValue(pBtn->m_clr) )
		);
	::AfxMessageBox( sMsg );
}

void CMainFrame::OnClickedPaletteButtonR( UINT nID )
{
	nID -= 160;
	ASSERT( IDC_BUTTON17 <= nID && nID <= IDC_BUTTON176 );
CDynamicPaletteButton * pBtn = (CDynamicPaletteButton *)
		CWnd::FromHandlePermanent(
			::GetDlgItem( m_dlgForPanelPalette.m_hWnd, nID ) 
			);
	ASSERT_VALID( pBtn );
	m_wndColorStatic.m_clrOut = pBtn->m_clr;
	m_wndColorStatic.Invalidate();
CString sMsg;
	sMsg.Format(
		_T("Palette button %d clicked (right mouse button)\nColor is #%02X%02X%02X"),
		nID - IDC_BUTTON17 + 1,
		int( GetRValue(pBtn->m_clr) ),
		int( GetGValue(pBtn->m_clr) ),
		int( GetBValue(pBtn->m_clr) )
		);
	::AfxMessageBox( sMsg );
}